package com.colin.app.bean;

/**
 * Created by Colin on 2017/2/23.
 * 创建时需要消耗很多资源，即new出这个类的代价很大；
 * 或者是这个类占用很多内存，如果创建太多这个类实例会导致内存占用太多。
 */

public class Singleton {
    //单例模式
    private volatile static Singleton instance;

    //将默认的构造函数私有化，防止其他类手动new
    private Singleton() {
    }

    /**
     * 单线程下的系统，这么写肯定没问题。可是如果是多线程环境呢？这代码明显不是线程安全的，存在隐患：某个线程拿到的instance可能是null
     *
     * @return
     */
    public static Singleton getInstance1() {
        if (null == instance) {
            instance = new Singleton();
        }
        return instance;
    }

    /**
     * 线程安全
     * 加sychronized关键字。
     * 每次调用getInstance()时都要执行同步，这带来没必要的性能上的消耗。注意，在方法上加sychronized关键字时，
     * 一个线程访问这个方法时，其他线程无法同时访问这个类其他sychronized方法
     *
     * @return
     */
    public static Singleton getInstance2() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }



}
